;10-4.asm 显示大字单词Well
include 9004.mac       ; 包含宏定义文件（包含清屏和光标设置等宏）

;============ 数据段定义 ============
data segment
init db 2,4,3fh        ; 初始化参数: 
                       ; 第1字节=起始行(2), 
                       ; 第2字节=起始列(4), 
                       ; 第3字节=颜色属性(74h)
                       ; 颜色说明: 74h = 0111_0100 
                       ;   背景: 7(灰白), 前景: 4(红字)
                       ; 颜色表: 1蓝,2绿,3浅蓝,4红,5紫,6黄,7灰白,8灰

;=== 大字"Well"的字符阵列定义 ===
; 使用扩展ASCII字符绘制图形:
;  20h = 空格, 0DBh = 实心块, 0DCh = 下半块, 0DFh = 上半块
;  0FFh = 行结束标记, 00h = 图形结束标记

;=== 第1行 ===========================================================
well_s  db 3 dup(0dch), 20h, 3 dup(0dch),2 dup(20h), 3 dup(0dch),0ffh
; 图形: ▄▄▄ ▄▄▄  ▄▄▄

;=== 第2行 ===========================================================            
  db  20h,0dbh,3 dup(20h),0dbh,4 dup(20h),0dbh,5 dup(20h),2 dup(0dch)
  db 3 dup(20h),2 dup(0dch),2 dup(20h), 0ffh
; 图形: █   █    █     ▄▄  ▄▄

;=== 第3行 ===========================================================             
  db  20h,0dbh,3 dup(20h),0dbh,3 dup(20h),0dbh,7 dup(20h)
  db  0dbh,4 dup(20h),0dbh,2 dup(20h),0ffh
; 图形: █   █   █       █    █

;=== 第4行 ===========================================================         
  db  20h,0dbh,2 dup(20h),2 dup(0dbh),2 dup(20h),0dbh,2 dup(20h),0dch
  db  2 dup(0dfh),0dch,2 dup(20h),0dbh,4 dup(20h),0dbh,2 dup(20h),0ffh
; 图形: █  ██  █  ▄▀▀▄  █    █

;=== 第5行 ===========================================================             
  db  20h,0dbh,20h,0dbh,20h,0dbh,20h,0dbh,3 dup(20h),0dbh,2 dup(0dch),0dfh
  db  2 dup(20h),0dbh,4 dup(20h),0dbh,2 dup(20h),0ffh
; 图形: █ █ █ █   █▄▄▀  █    █

;=== 第6行 ===========================================================            
  db  20h,2 dup(0dbh),2 dup(20h),2 dup(0dbh),4 dup(20h),0dbh,5 dup(20h),0dbh
  db  4 dup(20h),0dbh,2 dup(20h),0ffh
; 图形: ██  ██    █     █    █

;=== 第7行 ===========================================================              
  db  20h,0dbh,3 dup(20h),0dbh,5 dup(20h),0dfh,2 dup(0dch),0dfh,2 dup(20h)
  db  0dbh,0dch,0dfh,2 dup(20h),0dbh,0dch,0dfh,0ffh
; 图形: █   █     ▀▄▄▀  █▄▀   █▄▀

  db  00  ; 图形结束标记
;====================================================================

well_col db ?  ; 保存起始列位置（用于换行时光标复位）
data ends              
;============ 代码段定义 ============
code segment
   assume cs:code,ds:data  ; 设定段寄存器关联
start:
    mov ax,data
    mov ds,ax          ; 初始化DS寄存器
    
    mov si,0           ; SI清零（虽然后面会覆盖，但习惯性初始化）
    clearsc            ; 调用宏：清屏（可能使用int 10h的06h功能）
    
    ; 初始化显示参数
    mov si,offset init ; SI指向init数组
    mov dh,[si]        ; 读取起始行(2)
    inc si
    mov dl,[si]        ; 读取起始列(4)
    mov well_col,dl    ; 保存起始列到变量
    inc si
    mov bl,[si]        ; 读取颜色属性(74h)
    
    cursor dh,dl       ; 调用宏：设置光标位置(2,4)
    
    mov si,offset well_s ; SI指向字符阵列
    call graph_block    ; 调用显示过程
    
    ; 程序退出
    mov ah,4ch         ; DOS功能号：程序终止
    int 21h                         
    
;------------------- 图形显示子程序 -------------------  				
graph_block proc near    
write:           
    mov al,[si]        ; 从阵列加载一个字符
    inc si             ; 指针递增
    cmp al,0ffh        ; 检查是否行结束标记
    je  next1          ; 是则跳转到换行处理
    cmp al,0           ; 检查是否图形结束标记
    jz  exit           ; 是则退出子程序
    
    ; 显示单个字符
    mov ah,9           ; BIOS功能号：写字符和属性
    mov bh,0           ; 显示页0
    mov cx,1           ; 重复次数=1
    int 10h            ; 调用BIOS显示服务
    
    inc dl             ; 列位置+1
    cursor dh,dl       ; 更新光标位置
    jmp write          ; 继续处理下一个字符
                       
next1:  ; 行结束处理
    inc dh             ; 行号+1 (换行)
    mov dl,well_col    ; 列复位到起始位置
    cursor dh,dl       ; 设置新行光标位置
    jmp write          ; 继续处理

exit:   ; 结束处理
    cursor 30,10       ; 将光标移到底部(避免干扰显示)
    ret               ; 返回主程序
graph_block endp

code ends
end start